home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / artemis / artsrc2 / gline.asm < prev    next >
Assembly Source File  |  1994-06-01  |  4KB  |  265 lines

  1. ;    私製ライブラリ・グラフィック篇
  2. ;    (c) MATSUUCHI Ryosuke in Dec,1992
  3. ;
  4. ;    gline.asm
  5. ;
  6. ;    1992. 8. 2(Sun)
  7. ;    1992.12.28(Sun)
  8.  
  9.         public    gline,_gline
  10.         extrn    _gwrtreg:near, _gpset:near
  11.         extrn    _ghline:near, _gvline:near
  12.         
  13.         include    grplib.inc
  14.         
  15.         assume    cs:cseg, ds:dseg
  16.  
  17.  
  18. POSIT        struc
  19.     x    dd    0
  20.     y    dd    0
  21. POSIT        ends
  22.  
  23.  
  24. setPOS        macro    var,xreg,yreg
  25.         mov    [var.x],xreg
  26.         mov    [var.y],yreg
  27.         endm
  28.  
  29. incPOSx        macro    var
  30.         inc    [var.x]
  31.         endm
  32.  
  33. decPOSx        macro    var
  34.         dec    [var.x]
  35.         endm
  36.  
  37. incPOSy        macro    var        ;eax を壊す
  38.         mov    eax,[ydir]
  39.         add    [var.y],eax
  40.         endm
  41.  
  42. decPOSy        macro    var        ;eax を壊す
  43.         mov    eax,[ydir]
  44.         sub    [var.y],eax
  45.         endm
  46.  
  47. psetPOS        macro    var
  48.         local    norm
  49.         pushad
  50.         mov    eax,[var.x]
  51.         mov    ebx,[var.y]
  52.         mov    ecx,[color]
  53.         mov    edx,[logop]
  54.         cmp    [linetype],1
  55.         jnz    norm
  56.         xchg    eax,ebx
  57. norm:        call    _gpset
  58.         popad
  59.         endm
  60.  
  61.  
  62.  
  63. dseg segment dword 'DATA'
  64.  
  65.  
  66. x1        dd    0
  67. y1        dd    0
  68. x2        dd    0
  69. y2        dd    0
  70. xlen        dd    0
  71. ylen        dd    0
  72. ydir        dd    0
  73. p1        POSIT    <>
  74. p2        POSIT    <>
  75. rate        dd    0
  76. rateacc        dd    0
  77. ct        dd    0
  78. color        dd    0
  79. logop        dd    0
  80. linetype    dd    0    ;0=[xlen > ylen]  1=[xlen < ylen]  2=[xlen = ylen]
  81.                 ;3=[xlen = 0 ]  4=[ylen = 0 ]
  82.  
  83.  
  84. dseg ends
  85.  
  86.  
  87.  
  88. cseg segment dword 'CODE'
  89.  
  90. ;---------------------------------------------------------------
  91. ;    _gline : 直線の描画
  92. ;        in  EAX : x1
  93. ;            EBX : y1
  94. ;            ECX : x2
  95. ;            EDX : y2
  96. ;            ESI : color
  97. ;            EDI : logop
  98. ;
  99. ;    void gline(int x1,int y1,int x2,int y2,int col,int logop);
  100. ;---------------------------------------------------------------
  101.  
  102. gline        proc near
  103.         push    ebx
  104.         push    esi
  105.         push    edi
  106.         pushfd
  107.         mov    eax,[esp+16+4]
  108.         mov    ebx,[esp+16+8]
  109.         mov    ecx,[esp+16+12]
  110.         mov    edx,[esp+16+16]
  111.         mov    esi,[esp+16+20]
  112.         mov    edi,[esp+16+24]
  113.         call    _gline
  114.         popfd
  115.         pop    edi
  116.         pop    esi
  117.         pop    ebx
  118.         ret
  119. gline        endp
  120.  
  121.  
  122.  
  123. _gline        proc near
  124.         call    _gline_init
  125.         cmp    [linetype],3
  126.         jl    #6
  127.             call    _gline_hv
  128.             jmp    #7
  129.         #6:
  130.             pushad
  131.             xor    ecx,ecx
  132.             #0:
  133.                 cmp    ecx,[ct]
  134.                 jnl    #1
  135.                 psetPOS    p1
  136.                 ;psetPOS p2
  137.                 cmp    [linetype],2
  138.                 jge    #3
  139.                     mov    eax,[rate]
  140.                     add    [rateacc],eax
  141.                     jnc    #2
  142.                         incPOSy    p1
  143.                         ;decPOSy p2
  144.                     #2:
  145.                     jmp    #4
  146.                 #3:
  147.                     incPOSy    p1
  148.                     ;decPOSy p2
  149.                 #4:
  150.                 inc    ecx
  151.                 incPOSx    p1
  152.                 ;decPOSx p2
  153.             jmp    #0
  154.             #1:
  155.             ;bt    [xlen],0
  156.             ;jnc    #5
  157.             ;    psetPOS    p1
  158.             ;#5:
  159.             popad
  160.         #7:
  161.         ret
  162. _gline        endp
  163.  
  164.  
  165. ;● LINE のサブルーチン(各変数をパラメーターから算出する)
  166. ;----------------------------------------------------------------------------
  167.  
  168.  
  169. _gline_init    proc
  170.         pushad
  171.         mov    [color],esi
  172.         mov    [logop],edi
  173.         mov    esi,ecx        ;esi := abs(x2-x1)
  174.         sub    esi,eax
  175.         jnc    #0
  176.         neg    esi
  177. #0:        mov    edi,edx        ;edi := abs(y2-y1)
  178.         sub    edi,ebx
  179.         jnc    #1
  180.         neg    edi
  181. #1:        cmp    esi,0
  182.         je    #9
  183.         cmp    edi,0
  184.         je    #10
  185.         cmp    esi,edi        ;abs(x2-x1) と abs(y2-y1) を比較する
  186.         je    #2
  187.         jg    #3
  188.         jmp    #11
  189.         #9:    ;-------------[xlen = 0]
  190.             mov    [linetype],3
  191.             jmp    #4
  192.         #10:    ;-------------[ylen = 0]
  193.             mov    [linetype],4
  194.             jmp    #4
  195.         #11:    ;-------------[xlen < ylen]
  196.             mov    [linetype],1
  197.             xchg    esi,edi
  198.             xchg    eax,ebx
  199.             xchg    ecx,edx
  200.             jmp    #4
  201.         #2:    ;-------------[xlen = ylen]
  202.             mov    [linetype],2
  203.             jmp    #4
  204.         #3:    ;-------------[xlen > ylen]
  205.             mov    [linetype],0
  206.         #4:
  207.         cmp    eax,ecx        ;長辺側の座標を小・大の順にする
  208.         jng    #6
  209.             xchg    eax,ecx
  210.             xchg    ebx,edx
  211.         #6:
  212.         mov    [ydir],1    ;短辺側座標の増分を決める
  213.         cmp    ebx,edx
  214.         jng    #7
  215.             mov    [ydir],-1
  216.         #7:
  217.         inc    esi        ;長辺のドット数
  218.         mov    [xlen],esi
  219.         inc    edi        ;短辺のドット数
  220.         mov    [ylen],edi
  221.         setPOS    p1,eax,ebx    ;始点の位置情報
  222.         setPOS    p2,ecx,edx    ;終点の位置情報
  223.         cmp    [linetype],2
  224.         jge    #8
  225.             mov    edx,edi        ;傾き(短辺 / 長辺)の算出
  226.             xor    eax,eax
  227.             mov    ebx,esi
  228.             div    ebx
  229.             mov    [rate],eax
  230.         #8:
  231.         mov    [ct],esi    ;ct := xlen
  232.         mov    [rateacc],0    ;傾き加算値の初期化
  233.         popad
  234.         ret
  235. _gline_init    endp
  236.  
  237.  
  238. ;● LINE のサブルーチン(水平/垂直線の場合)
  239. ;----------------------------------------------------------------------------
  240.  
  241.  
  242. _gline_hv    proc
  243.         pushad
  244.         cmp    [linetype],3
  245.         jnz    #0
  246.             mov    ecx,edx
  247.             mov    edx,esi
  248.             mov    esi,edi
  249.             call    _gvline
  250.             jmp    #1
  251.         #0:
  252.             xchg    ebx,ecx
  253.             mov    edx,esi
  254.             mov    esi,edi
  255.             call    _ghline
  256.         #1:
  257.         popad
  258.         ret
  259. _gline_hv    endp
  260.  
  261.  
  262. cseg ends
  263.  
  264. end
  265.